package leetcode.year2021.month11;

import java.util.*;

// 438. 找到字符串中所有字母异位词
public class _13_1FindAnagrams438 {
  public static void main(String[] args) {
    String a = "baa";
    String b = "aa";
    findAnagrams(a,b);
  }
  // 滑动窗口，使用一个数组，保存所有字符出现的次数
  public static List<Integer> findAnagrams(String s, String p) {
    ArrayList<Integer> res = new ArrayList<>();
    int[] sss = new int[26];
    int[] ppp = new int[26];

    if (p.length() > s.length()){
      return res;
    }

    for (int i = 0; i < p.length(); i++) {
      ppp[p.charAt(i) - 'a']++;
      sss[s.charAt(i) - 'a']++;
    }
    if (Arrays.equals(ppp,sss)){
      res.add(0);
    }

    for (int i = p.length(); i < s.length(); i++) {
      sss[s.charAt(i) - 'a']++;
      sss[s.charAt(i - p.length()) - 'a']--;
      if (Arrays.equals(ppp,sss)){
        res.add(i - p.length() + 1);
      }
    }
    return res;
  }

  // 解题思路, 暴力解法超时
//  public static List<Integer> findAnagrams(String s, String p) {
//    ArrayList<Integer> ans = new ArrayList<>();
//
//    for (int i = 0; i <= s.length() - p.length(); i++) {
//      if (isEctopicWord(s,i,p)){
//        ans.add(i);
//      }
//    }
//    return ans;
//  }
//
//  public static boolean isEctopicWord(String s, int index, String b){
//    HashMap<Character, Integer> midMap = new HashMap<>();
//    for (int i = 0; i < b.length(); i++) {
//      midMap.put(b.charAt(i),midMap.getOrDefault(b.charAt(i),0)+1);
//    }
//
//    for (int i = index; i < index + b.length(); i++) {
//      if (!midMap.containsKey(s.charAt(i))){
//        return false;
//      }
//      Integer currNum = midMap.get(s.charAt(i));
//      if (currNum == 1){
//        midMap.remove(s.charAt(i));
//      } else {
//        midMap.put(s.charAt(i),currNum - 1);
//      }
//    }
//    return true;
//  }

  /**
   * 438. 找到字符串中所有字母异位词
   * 给定两个字符串 s 和 p，找到 s 中所有 p 的 异位词 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。
   *
   * 异位词 指由相同字母重排列形成的字符串（包括相同的字符串）。
   *
   *
   *
   * 示例 1:
   *
   * 输入: s = "cbaebabacd", p = "abc"
   * 输出: [0,6]
   * 解释:
   * 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
   * 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
   *  示例 2:
   *
   * 输入: s = "abab", p = "ab"
   * 输出: [0,1,2]
   * 解释:
   * 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
   * 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
   * 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
   *
   *
   * 提示:
   *
   * 1 <= s.length, p.length <= 3 * 104
   * s 和 p 仅包含小写字母
   */
}
